package controller;

import dao.DisciplinaProfessorJpaController;
import dao.EmentaJpaController;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import dao.exceptions.NonexistentEntityException;
import java.util.ArrayList;
import model.Disciplina;
import model.DisciplinaProfessor;
import model.Ementa;
import model.Matriculado;
import model.Professor;
import model.Turma;
import pagecontroller.JsfUtil;
import pagecontroller.PageManager;

/**
 *
 * @author Edilson Fernandes da Costa
 * @version 1.0
 */
public class DisciplinaProfessorController extends Controller {

    public DisciplinaProfessorController() {
        if (JsfUtil.getObjectFromSession("DisciplinaProfessorJpaController") == null) {
            jpaController = new DisciplinaProfessorJpaController();
        } else {
            jpaController = (DisciplinaProfessorJpaController) JsfUtil.getObjectFromSession("DisciplinaProfessorJpaController");
        }
    }
    private DisciplinaProfessor disciplinaProfessor = null;
    private DisciplinaProfessor disciplinaProfessorAux = null;
    private DisciplinaProfessorJpaController jpaController = null;
    private List<DisciplinaProfessor> disciplinaProfessors = null;
    private Disciplina disciplina = null;
    private Ementa ementaTemp;
    private int indexEmenta = 0;

    public void clear() {
        disciplina = null;
        disciplinaProfessor = null;
        indexEmenta = 0;


    }

    public String setPageDisciplinaCad() {
        clear();
        getPageManager().setPageDisciplinaCad();
        return "refreshPage";
    }
    
    public String setModalEmentaCad(){
        getPageManager().setModalEmentaCad();
        indexEmenta = 0;
        ementaTemp = null;
        return "refreshPage";
    }
    

    public String persiste() {
        if (disciplinaProfessor.getId() == null) {
            return create();
        } else {
            return update();
        }
    }

    public String update() {
        try {

            if (findDisciplina(getDisciplina().getNome()) != null) {
                disciplina = findDisciplina(getDisciplina().getNome());
            } else {
                getDisciplinaController().getJpaController().create(disciplina);
            }

            for (Ementa ementaBanco : getEmentaController().finEmentas(disciplinaProfessor)) {
                if (!ementaContemNaLista(ementaBanco)) {
                    getEmentaController().getJpaController().destroy(ementaBanco.getId());
                }
            }


            for (Ementa ementa : getEmentas()) {
                ementa.setDisciplinaProfessor(getDisciplinaProfessor());
                if (ementa.getId() == null) {
                    getEmentaController().getJpaController().create(ementa);
                } else {

                    getEmentaController().getJpaController().edit(ementa);

                }
            }


            getDisciplinaProfessor().setDisciplina(disciplina);
            getDisciplinaProfessor().setProfessor(getUsuarioLogado().getProfessor());

            jpaController.edit(getDisciplinaProfessor());



            disciplinaProfessorAux = disciplinaProfessor;
            disciplinaProfessor = null;
            JsfUtil.addSuccessMessage("Disciplina Atualizada com Sucesso");
            getPageManager().setPageDisciplinaRelat();

        } catch (NonexistentEntityException ex) {
            Logger.getLogger(DisciplinaProfessorController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            JsfUtil.addErrorMessage("Problema na Persistência do Erro: " + ex.getMessage());
            Logger.getLogger(DisciplinaProfessorController.class.getName()).log(Level.SEVERE, null, ex);
        }
        return "refreshPage";
    }

    public String create() {
        try {
            
            if(getEmentas()==null || getEmentas().size()==0){
                JsfUtil.addErrorMessage("É preciso cadastrar pelo menos uma Ementa.");
                return "refreshPage";
            }
            
            if (findDisciplina(getDisciplina().getNome()) != null) {
                disciplina = findDisciplina(getDisciplina().getNome());
            } else {
                getDisciplinaController().getJpaController().create(disciplina);
            }

            getDisciplinaProfessor().setDisciplina(disciplina);
            getDisciplinaProfessor().setProfessor(getUsuarioLogado().getProfessor());

            for (Ementa ementa : getEmentas()) {
                ementa.setDisciplinaProfessor(getDisciplinaProfessor());
//                getEmentaController().getJpaController().create(ementa);
            }

            
            jpaController.create(getDisciplinaProfessor());
            

            
            disciplinaProfessorAux = disciplinaProfessor;
            disciplinaProfessor = null;
            JsfUtil.addSuccessMessage("Disciplina cadastrado com sucesso.");
            getPageManager().setPageDisciplinaRelat();
        } catch (Exception e) {
            JsfUtil.ensureAddErrorMessage(e, "Ocorreu um erro na percistencia dos dados.");
            return null;
        }
        return "refreshPage";
    }

    public String edit() {
        DisciplinaProfessor disciplinaProfessorTemp = (DisciplinaProfessor) JsfUtil.getObjectFromRequestParameter("disciplinaProfessorTemp");
        this.setPageDisciplinaCad();

        this.disciplinaProfessor = disciplinaProfessorTemp;
        this.disciplinaProfessor.setEmentas(getEmentaController().finEmentas(disciplinaProfessor));

        this.setDisciplina(getDisciplinaProfessor().getDisciplina());

        return "refreshPage";
    }

    public String destroy() {
        
        DisciplinaProfessor disciplinaProfessorTemp = (DisciplinaProfessor) JsfUtil.getObjectFromRequestParameter("disciplinaProfessor");
        try {
            disciplinaProfessorTemp = jpaController.findDisciplinaProfessor(disciplinaProfessorTemp.getId());
            
            for(Ementa ementa: disciplinaProfessorTemp.getEmentas()){
                getEmentaController().getJpaController().destroy(ementa.getId());
            }
            
            
            for(Turma turma: disciplinaProfessorTemp.getTurmas()){
                
                for(Matriculado matriculado: getMatriculadoController().getMatriculados(turma)){
                    getMatriculadoController().getJpaController().destroy(matriculado.getId());
                }
                
                
                
                
                getTurmaController().getJpaController().destroy(turma.getId());
            }
            
            
            
            jpaController.destroy(disciplinaProfessorTemp.getId());
            JsfUtil.addSuccessMessage("DisciplinaProfessor removido com sucesso.");
            clear();
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(DisciplinaProfessorController.class.getName()).log(Level.SEVERE, null, ex);
        }

        return "refreshPage";
    }

//    public String addTurma() {
//        getPageManager().setPageTurmaCad();
//        return "refreshPage";
//    }
    public String destroyButton() {
        DisciplinaProfessor disciplinaProfessorTemp = disciplinaProfessorAux;
        try {
            jpaController.destroy(disciplinaProfessorTemp.getId());
            JsfUtil.addSuccessMessage("DisciplinaProfessor removida com sucesso.");
            disciplinaProfessorAux = null;

        } catch (NonexistentEntityException ex) {
            Logger.getLogger(AlunoController.class.getName()).log(Level.SEVERE, null, ex);
        }

        return "refreshPage";
    }

    public String load() {
        disciplinaProfessorAux = (DisciplinaProfessor) JsfUtil.getObjectFromRequestParameter("disciplinaProfessorTemp");
        disciplinaProfessorAux = jpaController.findDisciplinaProfessor(disciplinaProfessorAux.getId());
        disciplinaProfessorAux.setEmentas(getEmentaController().finEmentas(disciplinaProfessorAux));

        getPageManager().setPageDisciplinaRelat();

        return "refreshPage";
    }

    public String editButton() {
        this.setPageDisciplinaCad();
        this.disciplinaProfessor = disciplinaProfessorAux;
        this.setDisciplina(getDisciplinaProfessor().getDisciplina());
        return "refreshPage";
    }

    public DisciplinaProfessor getDisciplinaProfessor() {
        if (disciplinaProfessor == null) {
            disciplinaProfessor = new DisciplinaProfessor();
            disciplinaProfessor.setEmentas(new ArrayList<Ementa>());
        }
        return disciplinaProfessor;
    }

    public List<DisciplinaProfessor> getDisciplinaProfessors() {
        this.disciplinaProfessors = jpaController.findDisciplinaProfessorEntities();
        return this.disciplinaProfessors;
    }

    public DisciplinaProfessorJpaController getJpaController() {
        return jpaController;
    }

    public DisciplinaProfessor getDisciplinaProfessorAux() {
        return disciplinaProfessorAux;
    }

    public DisciplinaProfessor findDisciplinaProfessor(Integer id) {
        return jpaController.findDisciplinaProfessor(id);
    }

    public List<DisciplinaProfessor> findDisciplinaProfessor(Professor professor) {
        return jpaController.findDisciplinaProfessor(professor);
    }

    public List<DisciplinaProfessor> getDisciplinaProfessorLogado() {
        return jpaController.findDisciplinaProfessor(getUsuarioLogado().getProfessor());
    }

    public void addEmenta() {
        if (indexEmenta == 0) {
            getEmentas().add(ementaTemp);
        } else {
//            getEmentas().add(indexEmenta, ementaTemp);
        }

        ementaTemp = null;
        getPageManager().setModalVisible(false);
        indexEmenta = 0;
        //return "refreshPage";
    }

    public String removeEmenta() {
        ementaTemp = (Ementa) JsfUtil.getObjectFromRequestParameter("ementaTemp");
        getEmentas().remove(ementaTemp);
//        if (ementaTemp.getId() != null) {
//            try {
//                getEmentaController().getJpaController().destroy(ementaTemp.getId());
//            } catch (Exception ex) {
//                JsfUtil.addErrorMessage("Erro ao excluir ementa");
//            }
//        } 
        ementaTemp = null;

        return "refreshPage";
    }

    public void editEmenta() {
        ementaTemp = (Ementa) JsfUtil.getObjectFromRequestParameter("ementaTemp");
        indexEmenta = getEmentas().indexOf(ementaTemp)+1;
        getPageManager().setModalEmentaCad();
    }

    public List<Ementa> getEmentas() {
        return getDisciplinaProfessor().getEmentas();
    }

    public void setEmentas(List<Ementa> ementas) {
        getDisciplinaProfessor().setEmentas(ementas);
    }

    private Disciplina findDisciplina(String nome) {

        for (Disciplina d : getDisciplinaController().getDisciplinas()) {
            if (d.getNome().equalsIgnoreCase(nome)) {
                return d;
            }
        }
        return null;
    }

    public List<String> complete(String query) {

        List<String> results = new ArrayList<String>();
        for (Disciplina d : getDisciplinaController().getDisciplinas()) {
            if (d.getNome().startsWith(query)) {
                results.add(d.getNome());
            }
        }
        return results;
    }

    public Disciplina getDisciplina() {
        if (disciplina == null) {
            disciplina = new Disciplina();
        }
        return disciplina;
    }

    public void setDisciplina(Disciplina disciplina) {
        this.disciplina = disciplina;
    }

    public Ementa getEmentaTemp() {
        if (ementaTemp == null) {
            ementaTemp = new Ementa();
        }
        return ementaTemp;
    }

    public void setEmentaTemp(Ementa ementaTemp) {
        this.ementaTemp = ementaTemp;
    }

    private boolean ementaContemNaLista(Ementa ementa) {
        if (getEmentas().contains(ementa)) {
            return true;
        }
        return false;
//        
//        for (Ementa ementaLista : getEmentas()) {
//            
//            
//            if (ementaLista.equals(ementa) {
//                return true;
//            }
//        }
//        return false;
    }
}